package com.util;

import org.apache.http.HttpResponse;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description:
 * @Auther: tz
 * @Date: 2023/9/13 15:57
 */
public class AliyunSmsUtil {

    private static  String msgHost = "";    // 主机地址
    private static  String appCode = "";    // 阿里云appcode
    private static  String templetCode = "";// 验证码短信模板ID
    private static  String templetPwd = ""; // 注册时密码短信模板ID
    private static  String path = "";       // 接口地址
    private static  String method = "POST";

    public static void init(String h,String acode,String pa,String templetCode,String templetPwd){
        msgHost = h;
        appCode = acode;
        templetCode = templetCode;
        templetPwd = templetPwd;
        path = pa;
    }

    /**
     * 发送国际短信验证码
     * @param tel       号码
     * @param message   验证码或密码
     * @param type      类型（1：发送验证码  2：发送密码）
     * @return
     */
    public static boolean send(String tel,String message,int type){

        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appCode);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        Map<String, String> querys = new HashMap<String, String>();
        Map<String, String> bodys = new HashMap<String, String>();
        bodys.put("channel", "0");
        bodys.put("mobile", tel);
        if (type == 1){
            bodys.put("templateID", templetCode);
            bodys.put("templateParamSet", message+",5");
        }else{
            bodys.put("templateID", templetPwd);
            bodys.put("templateParamSet", message);
        }
//        bodys.put("callbackUrl", "http://test.dev.esandcloud.com");
        try {
            /**
             * 重要提示如下:
             * HttpUtils请从
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
             * 下载
             *
             * 相应的依赖请参照
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
             */
            HttpResponse response = AliyunHttpUtils.doPost(msgHost, path, method, headers, querys, bodys);
            if("200".equals(response.toString().substring(9,12))){
                return true;
            }else{
                return false;
            }
            //获取response的body
//            System.out.println(EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  false;
    }

    /**
     * 随机生成验证码
     * @param phone		手机号码
     * @return
     */
    public static String createPhoneCode(String phone){
        //利用哈希值生成验证码
        int hash =phone.hashCode();
        //加密
        int encryption= 2020666;
        //用hash异或上加密得到生成第一次加密结果
        //这个生成的加过永远是固定的如果加密码不动的情况下
        long result= hash ^ encryption;
        //利用获得当前时间再次加密得出结果
        long time = System.currentTimeMillis();
        result=result^time;
        //取后六位
        long code=  result % 1000000;
        //此时随机验证码生成完成
        //此时会出现生成的验证码为负值，利用三目表达式进行解决
        code=code<0? -code:code;
        //此时还会出现第二个问题当生成000656这种只会显示656不会补零所以我们现在要解决当位数不够在前补零
        //解决思路利用数据结构的算法，利用数组，将得到的验证码长度作为数组的角码，在拼接字符就可以完成补零
        //先把得到的验证码变成字符串
        String  codeStr=code+"";
        //再把code的字符长度取出,作为数组的角标
        int len=codeStr.length();
        String[] patch ={"000000","00000","0000","000","00","0",""};
        //验证有多少为需要补
        String patch1 = patch[len];
        return patch1;
    }

}
